/**
 * 给你一个整数数组 nums 和一个整数 k 。
 * 每一步操作中，你需要从数组中选出和为 k 的两个整数，并将它们移出数组。
 * 返回你可以对数组执行的最大操作数。
 */

var maxOperations = function(nums, k) {
    /**
     * 思路：
     * 1. 定义一个 map 对象，用于存储数组中的元素和出现的次数
     * 2. 遍历数组，如果 map 中存在 k - nums[i]，则 count++，并将 map 中 k - nums[i] 的次数减 1
     * 3. 如果 map 中不存在 nums[i]，则将 nums[i] 存入 map 中
     * 4. 时间复杂度：O(n)，n 为数组的长度
     * 
     * 原理解析：
     * 1. 遍历数组，如果 map 中存在 k - nums[i]，则表示找到了和为 k 的两个整数, map 中 k - nums[i] 的次数减 1，表示已经找到了一个和为 k 的两个整数
     * 3. 如果 map 中不存在 nums[i]，则将 nums[i] 存入 map 中
     * 4. 返回 count，表示可以对数组执行的最大操作数
     */
    let map = new Map()
    let count = 0
    for (let i = 0;i < nums.length;i ++) {
        let num = k - nums[i]
        if (map.has(num) && map.get(num) > 0) {
            count++
            map.set(num, map.get(num) - 1)
        } else {
            map.set(nums[i], (map.get(nums[i]) || 0) + 1)
        }
    }
    return count
};